package com.jlg.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 
 * author: huazhang 
 * since : 2011-3-15
 */
public class ChineseUtil
{

    /**
     * 对有中文的字符串进行编码
     * 
     * @param str
     */
    public static String encodeChineseStr(String str)
    {
        try
        {
            StringBuffer sb = new StringBuffer();
            Pattern p = Pattern.compile("[\u4e00-\u9fa5]+"); // 中文的正则
            Matcher m = p.matcher(str);
            boolean b = m.find();
            int last = 0;
            while (b)
            {
                m.appendReplacement(sb, URLEncoder.encode(m.group(), "utf-8"));
                last = m.end();
                b = m.find();
            }
            if (str.length() > last)
                sb.append(str.substring(last));
            if (sb != null && sb.length() > 0)
                str = sb.toString();
        } catch (Exception e)
        {
            return str;
        }
        return str;
    }

    /**
     * 对有中文的字符串进行编码
     * 
     * @param str
     */
    public static boolean hasChinese(String str)
    {
        StringBuffer sb = new StringBuffer();
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]+"); // 中文的正则
        Matcher m = p.matcher(str);
        return m.find();

    }

    /**
     * 获取汉字串拼音首字母，英文字符不变
     * 
     * @param chinese
     *            汉字串
     * @return 汉语拼音首字母
     */
    public static String chinese2FirstPinyin(String chinese)
    {
        StringBuffer pybf = new StringBuffer();
        char[] arr = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < arr.length; i++)
        {
            if (arr[i] > 128)
            {
                try
                {
                    String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i],
                            defaultFormat);
                    if (_t != null)
                    {
                        pybf.append(_t[0].charAt(0));
                    }
                } catch (BadHanyuPinyinOutputFormatCombination e)
                {
                    e.printStackTrace();
                }
            } else
            {
                pybf.append(arr[i]);
            }
        }
        return pybf.toString().replaceAll("\\W", "").trim();
    }

    /**
     * 获取汉字串拼音，英文字符不变
     * 
     * @param chinese
     *            汉字串
     * @return 汉语拼音
     */
    public static String chinese2Pinyin(String chinese)
    {
        StringBuffer pybf = new StringBuffer();
        char[] arr = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < arr.length; i++)
        {
            if (arr[i] > 128)
            {
                try
                {
                    pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i],defaultFormat)[0]);
                } catch (Exception e)
                {
                    
                }
            } else
            {
                pybf.append(arr[i]);
            }
        }
        return pybf.toString();
    }

    public static void main(String[] args) throws UnsupportedEncodingException
    {
        String x = "张华";
        System.out.println(ChineseUtil.chinese2FirstPinyin(x));
        System.out.println(ChineseUtil.chinese2Pinyin(x));
    }

}
